package com.yangjian.filter;


import com.yangjian.bean.Employee;
import com.yangjian.bean.User;
import com.yangjian.util.BaseContext;
import com.yangjian.util.LoginUtils;
import lombok.extern.slf4j.Slf4j;


import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;


/*
这是一个过滤器
    1.创建一个类，实现一个接口：Filter
    2.在类上打上一个注解  @WebFilter("/*")
    3.要想要这个过滤器生效，需要在启动类上打上一个注解  @ServletComponentScan
    4.在方法里进行过滤操作
        4.1：将req与resp进行转型（向下转型）
        4.2.获取地址
            req.getRequestURI()
            req.getRequestURL()
        4.3.判断是否属于直接放行的请求
                如果是，就直接放行（login   .css   .js   images    plugin   style   .ico）

        4.4.判断是否登录
            4.4.0.把存储在session的数据取出来进行判断
            4.4.1：如果登录了，就放行
            4.4.2.如果没有登录就重定向到登陆页面
 */



@Slf4j
@WebFilter("/*")
public class LoginFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

        //将req与resp进行转型（向下转型）
        HttpServletRequest req = (HttpServletRequest) servletRequest;
        HttpServletResponse resp = (HttpServletResponse) servletResponse;

        //获取请求端是电脑端还是手机端

        String header = req.getHeader("User-Agent");
        boolean mobileDevice = LoginUtils.isMobileDevice(header);
        //获取地址
        String uri = req.getRequestURI();
        //System.out.println("捕捉到了= " + uri);
        log.debug("***捕捉到的地址{}****" ,uri);


        //判断是否属于直接放行的请求
        //
        //if (uri.contains("login")){
        //
        //    filterChain.doFilter(req, resp);
        //    return;
        //}

        if (uri.contains("login") || uri.endsWith(".css") || uri.endsWith(".js") || uri.contains("images")
                || uri.contains("plugin") || uri.contains("style") || uri.endsWith(".ico")||uri.contains("sms")
        || uri.contains("doc.html") ||uri.contains("webjars/**") || uri.contains("swagger-resources") ||uri.contains("v2/api-docs")
        ) {

            //是，就直接放行
            filterChain.doFilter(req, resp);

            return;
        }

        if (!mobileDevice){

            //判断是否登录
            //从session作用域中获取数据
            Employee employee= (Employee) req.getSession().getAttribute("employee");

            if (employee !=null){

                //存储员工的id
                BaseContext.setCurrentId(employee.getId());
                filterChain.doFilter(req,resp);
            return;
            }

            //如果没有，重定向跳转到登录页面
            resp.sendRedirect("/backend/page/login/login.html");
            return;
        }



        //获取用户存储信息
        User user = (User) req.getSession().getAttribute("user");

        //判断用户有没有登录
        if (user!=null){//表示用户登录了
            //存储用户的id
            BaseContext.setCurrentId(user.getId());

            //放行
            filterChain.doFilter(req,resp);
            return;
        }

        //表示用户没有登录，就跳转到手机端登录页面
            resp.sendRedirect("/front/page/login.html");



    }

    @Override
    public void destroy() {

    }
}
